"""
Copyright (C) 2021 THL A29 Limited, a Tencent company.  All rights reserved.
The below software in this distribution may have been modified by THL A29 Limited ("Tencent Modifications").
All Tencent Modifications are Copyright (C) THL A29 Limited.
Copyright (c) OpenMMLab. All rights reserved.
"""
import warnings

import mmcv
from packaging.version import parse

from .version import __version__


def digit_version(version_str: str, length: int = 4):
    """Convert a version string into a tuple of integers.

    This method is usually used for comparing two versions. For pre-release
    versions: alpha < beta < rc.

    Args:
        version_str (str): The version string.
        length (int): The maximum number of version levels. Default: 4.

    Returns:
        tuple[int]: The version info in digits (integers).
    """
    version = parse(version_str)
    assert version.release, f'failed to parse version {version_str}'
    release = list(version.release)
    release = release[:length]
    if len(release) < length:
        release = release + [0] * (length - len(release))
    if version.is_prerelease:
        mapping = {'a': -3, 'b': -2, 'rc': -1}
        val = -4
        # version.pre can be None
        if version.pre:
            if version.pre[0] not in mapping:
                warnings.warn(f'unknown prerelease version {version.pre[0]}, '
                              'version checking may go wrong')
            else:
                val = mapping[version.pre[0]]
            release.extend([val, version.pre[-1]])
        else:
            release.extend([val, 0])

    elif version.is_postrelease:
        release.extend([1, version.post])
    else:
        release.extend([0, 0])
    return tuple(release)


MMCV_MINIMUM_VERSION = '1.3.8'
MMCV_MAXIMUM_VERSION = '2.2.0'
mmcv_version = digit_version(mmcv.__version__)

assert (mmcv_version >= digit_version(MMCV_MINIMUM_VERSION)
        and mmcv_version <= digit_version(MMCV_MAXIMUM_VERSION)), \
    f'MMCV=={mmcv.__version__} is used but incompatible. ' \
    f'Please install mmcv>={MMCV_MINIMUM_VERSION}, <={MMCV_MAXIMUM_VERSION}.'

__all__ = ['__version__', 'digit_version']
